/**
 * Created with IntelliJ IDEA.
 * Description:
 * Lambda表达式
 * User: xwl
 * Date: 2023-06-04
 * Time: 18:23
 */

@FunctionalInterface
interface NoParameterNoReturn {
    // 注意：只能有一个抽象方法
    void test();
    static void test2() {

    }
    default void test3() {

    }
}

@FunctionalInterface
interface NoParameterNoReturn1 {
    // 注意：只能有一个抽象方法
    void test(int a);
}

@FunctionalInterface
interface NoParameterNoReturn2 {
    // 注意：只能有一个抽象方法
    void test(int x, int y);
}

@FunctionalInterface
interface NoParameterNoReturn3 {
    // 注意：只能有一个抽象方法
    int test();
}

@FunctionalInterface
interface NoParameterNoReturn4 {
    // 注意：只能有一个抽象方法
    int test(int a);
}

@FunctionalInterface
interface NoParameterNoReturn5 {
    // 注意：只能有一个抽象方法
    int test(int x, int y);
}

public class Test {
    public static void main(String[] args) {
        // 匿名内部类
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("hello");
            }
        };
        // 调用
        noParameterNoReturn.test();

        // Lambda -- 类似匿名内部类的简化
        // 无参无返回值
        NoParameterNoReturn noParameterNoReturn1 =  () -> System.out.println("无参数无返回值");
        noParameterNoReturn1.test();
        // 一个参数无返回值,括号和类型都可省略
        NoParameterNoReturn1 noParameterNoReturn2 =  a -> {
            System.out.println("一个参数无返回值:" + (a + 1));
        };
        noParameterNoReturn2.test(14);
        // 俩个参数无返回值，括号不可省略,类型不可单独省略
        NoParameterNoReturn2 noParameterNoReturn3 =  (x, y) -> {
            System.out.println("俩个参数无返回值:" +( x + y + 1));
        };
        noParameterNoReturn3.test(1,2);
        // 无参有返回值
        NoParameterNoReturn3 noParameterNoReturn4 =  () -> 10;
        int ret = noParameterNoReturn4.test();
        System.out.println("无参有返回值:" + ret);
        // 一个参数有返回值
        NoParameterNoReturn4 noParameterNoReturn5 =  x -> x + 10;
        int ret2 = noParameterNoReturn5.test(9);
        System.out.println("一个参数有返回值:" + ret2);
        // 俩个参数有返回值
        NoParameterNoReturn5 noParameterNoReturn6 =  (x, y) -> x * y;
        int ret3 = noParameterNoReturn6.test(10,2);
        System.out.println("俩个参数有返回值:" + ret3);

        // 匿名内部类捕获的变量 应该是 一个常量或者一个没有被改变过值的变量

    }
}
